//程序逻辑控制

//一.顺序结构

//按照代码顺序执行
public class J20250302 {
    public static void main1(String[] args) {
        System.out.println("aaa");
        System.out.println("bbb");
        System.out.println("ccc");
        //aaa
        //bbb
        //ccc
    }


//二. 分⽀结构

    //2.1   if语句

    public static void main2(String[] args) {

        //格式1 ⼩明，如果这次考试考到90分或以上，给你奖励⼀个鸡腿。

        int a = 92;                                //语法格式1 （如果布尔表达式结果为true，执⾏if中的语句，否则不执⾏）
        if (a >= 90) {                             // if（布尔表达式）{
            System.out.println("吃个⼤鸡腿!!!");     //      语句
        }                                          // }

        //格式2 ⼩明，如果这次考到90分以上，给你奖励⼀个⼤鸡腿，否则奖你⼀个⼤嘴巴⼦

        int b = 96;                                //语法格式2 (如果布尔表达式结果为true，则执⾏if中语句，否则执⾏else中语句)
        if (b >= 90) {                             // if (布尔表达式）{
            System.out.println("吃个⼤鸡腿!!!");     //      语句1
        } else {                                   // }else{
            System.out.println("挨⼤嘴巴⼦!!!");     //      语句2
        }                                          // }

        //格式3 老师考虑到孩子的自尊心，将成绩分为优良中三个等级

        int score = 86;                            //   语法格式3 （持续执行直到符合则结束并且打印结果）
        if (score >= 80 && score < 100) {            //   if(布尔表达式1）{
            System.out.println("优");              //        语句1
        } else if (score >= 60 && score < 80) {      //    }else if(布尔表达式2）{
            System.out.println("良");             //         语句2
        } else if (score >= 0 && score < 60) {       //    }else if(布尔表达式3）{
            System.out.println("中");             //         语句3
        } else {                                    //    }else{
            System.out.println("错误数据");        //         语句4
        }                                        //     }
    }

    //递进练习 1.判断一个数是奇数还是偶数 2.判断一个数是正数，0还是负数 3.判断是否是闰年
    public static void main3(String[] args) {

        //判断奇偶
        int num = 10;
        if (num % 2 == 0) {
            System.out.println("偶数");
        } else {
            System.out.println("奇数");
        }

        //判断正数 0 负数
        int number = -1;
        if (number > 0) {
            System.out.println("正数");
        } else if (number < 0) {
            System.out.println("负数");
        } else {
            System.out.println(0);
        }

        //判断是否为闰年(世纪年能被400整除，普通年能被4整除）
        int year = 2025;
        if (year % 100 == 0) {
            if (year % 400 == 0) {    //判断世纪年
                System.out.println("闰年！");
            } else {
                System.out.println("不是闰年！");
            }
        } else {
            if (year % 4 == 0) {       //普通年
                System.out.println("闰年！");
            } else {
                System.out.println("不是闰年！");
            }
        }
    }


    //2.2 switch 语句

    //. 先计算表达式的值
    //. 和case依次⽐较，⼀旦有响应的匹配就执⾏该项下的语句，直到遇到break时结束
    //. 当表达式的值没有与所列项匹配时，执⾏default
    //switch里只能写的类型 基本类型：byte、char、short、int，(注意不能是long类型) 引⽤类型：String常量串、枚举类型
    //break不要遗漏,否则会失去"多分⽀选择"的效果

    public static void main4(String[] args) {      //只有一个语句的时候可以省略花括号（不建议）  switch(表达式)注意：表达式里只能写简单的语句且类型固定
        int day = 1;
        switch (day) {                             //switch(表达式){
            case 1:                               //       case 常量值1:{
                System.out.println("星期⼀");      //              语句1；
                break;                            //              break;
            case 2:                               //          }
                System.out.println("星期⼆");      //       case 常量值2:{
                break;                            //              语句2；
            case 3:                               //              break;
                System.out.println("星期三");      //          }
                break;                            //         .......
            case 4:                               //       default:{
                System.out.println("星期四");      //                内容都不满足时执行语句；
                break;                            //                break;
            case 5:                               //                }
                System.out.println("星期五");
                break;
            case 6:
                System.out.println("星期六");
                break;
            case 7:
                System.out.println("星期⽇");
                break;
            default:
                System.out.println("输⼊有误");
                break;
        }
    }


//三.循环结构

    //3.1 while循环 (循环条件为true,则执⾏循环语句;否则结束循环.)

    public static void main5(String[] args) {
        //递进习题训练
        //打印1—10的数字
        int a = 1;
        while (a <= 10) {
            System.out.print(a + " ");//print 打印结果不会换行
            a++;
        }//1 2 3 4 5 6 7 8 9 10

        //计算1-100的和
        int b = 1;
        int m = 0;
        while (b <= 100) {
            m += b;
            b++;
        }
        System.out.println(m); //5050

        //计算5的阶乘
        int c = 1;
        int whole = 1;  //注意这里不能写0
        while (c <= 5) {
            whole *= c;
            c++;
        }
        System.out.println(whole);//120


        //计算1！+2！+3！+4！+5！
        int num = 1;
        int sum = 0;                  // 外层循环负责求阶乘的和
        while (num <= 5) {

            int factorResult = 1;
            int tmp = 1;             // ⾥层循环负责完成求阶乘的细节.
            while (tmp <= num) {
                factorResult *= tmp;
                tmp++;
            }
            sum += factorResult;
            num++;
        }
        System.out.println("sum = " + sum);//sum = 153
    }/*这⾥我们发现,当⼀个代码中带有多重循环的时候,代码的复杂程度就⼤ 提⾼了.⽽⽐较复杂的代码就更容易出错.后⾯我们会采⽤更简单的办法来解决这个问题
     注意事项
     1. 和if类似,while下⾯的语句可以不写{},但是不写的时候只能⽀持⼀条语句.建议还是加上{}
     2. 和if类似,while后⾯的{建议和while写在同⼀⾏.
     3. 和if类似,while后⾯不要多写分号,否则可能导致循环不能正确执⾏ */


    //3.2 break (break的功能是让循环提前结束.)

    public static void main6(String[] args) {
        //找到100-200第一个3的倍数
        int num = 100;
        while (num <= 200) {
            if (num % 3 == 0) {
                System.out.println("找到了第一个 3 的倍数 为:" + num);
                break;
            }
            num++;
        }// 执⾏结果 找到了 3 的倍数, 为:102


        //3.3 continue (continue的功能是跳过这次循环,⽴即进⼊下次循环.)

        //找到100-200中所有3的倍数
        int n = 100;
        while (n <= 200) {
            if (n % 3 != 0) {
                n++; // 这⾥的 ++ 不要忘记! 否则会死循环.
                continue;
            }
            System.out.println("找到了 3 的倍数, 为:" + n);
            n++;
        }


        //3.4 for 循环

       /* 执行顺序:表达式1>布尔表达式>表达式3>表达式2
          无布尔表达式则会进入死循环!!!

       for (表达式1 ; 布尔表达式 ; 表达式2){
            表达式3;
        }
       */
        //打印1-10
        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
        }

        //计算1-100的和
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println("sum = " + sum);//sum = 5050

        //计算5的阶乘
        int result = 1;
        for (int i = 1; i <= 5; i++) {
            result *= i;
        }
        System.out.println("result = " + result);//result = 120

        //计算1!+2!+3!+4!+5!
        int s = 0;
        for (int i = 1; i <= 5; i++) {
            int t = 1;
            for (int j = 1; j <= i; j++) {
                t *= j;
            }
            s += t;
        }
        System.out.println("s = " + s);//s = 153
        /*【注意事项】(和while循环类似)
        1. 和if类似,for下⾯的语句可以不写{},但是不写的时候只能⽀持⼀条语句.建议还是加上{}
        2. 和if类似,for后⾯的{建议和while写在同⼀⾏.
        3. 和if类似,for后⾯不要多写分号,否则可能导致循环不能正确执⾏.
        4. 和while循环⼀样，结束单趟循环⽤continue，结束整个循环⽤break
        5. 表达式2如果缺失，代表该循环为死循环。*/


        //3.5 do while循环 （先执⾏循环语句,再判定循环条件，循环条件成⽴则继续执⾏，否则循环结束。）

        int a = 1;
        do {
            System.out.println(a);
            a++;
        } while (a <= 10);
        /*【注意事项】
        1. do while循环最后的分号不要忘记
        2. ⼀般do while很少⽤到,更推荐使⽤for和while.  */
    }










//四、小试牛刀

      /*1. 判定⼀个数字是否是素数
        2. 求出0〜999之间的所有“⽔仙花数”并输出。(“⽔仙花数”是指⼀个三位数，其各位数字的⽴⽅
        和确好等于该数本⾝，如： 153＝1^3＋5^3＋3^3 ，则153是⼀个“⽔仙花数”。)  */


    public static void main7(String[] args) {

        //判断素数

        int x = 11;
        int i = 2;
        for (; i <= Math.sqrt(x); i++) {         //数学方法Math.sqrt(x)是开根号
            if (x % i == 0) {
                System.out.println(x + "非素数");
                break;
            }
        }
        if (i > Math.sqrt(x)) {
            System.out.println(x + "素数");
        }


    }




    public static void main9(String[] args) {

        //水仙花数

        for (int j = 0; j < 999999; j++) {

            int count = 0;
            int tmp = j;
            int sum = 0;

            //计算是多少位数
            while (tmp != 0) {

                tmp /= 10;
                count++;
            }
            tmp = j;
            while (tmp != 0) {
                sum += Math.pow(tmp % 10, count);   //模10后的余数先count次方,再相加
                tmp /= 10;                         //除10,往前进一位数
            }
            if (sum == j) {                         //判断是否是水仙花数
                System.out.println(sum);
            }
        }

    }



}